#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/wait.h>

//让子进程sleep,不让父进程sleep --- 即写的慢
//int main()
//{
//    int pipefd[2] = {0};
//    if(pipe(pipefd) != 0){
//        perror("pipe error!");
//        return 1;
//    }
//
//    //pipefd[0]:读取段  pipefd[1]:写入端
//    printf("pipefd[0]：%d\n",pipefd[0]);//3
//    printf("pipefd[1]：%d\n",pipefd[1]);//4
//
//    if(fork() == 0){
//        //子进程---写入
//        close(pipefd[0]);
//        const char* msg = "hello-linux!";
//        while(1){
//            write(pipefd[1], msg, strlen(msg));
//            //printf("child say：father can read\n");
//            //sleep(1);
//        }
//        exit(0);
//    }
//    //父进程---读取
//    close(pipefd[1]);
//    char buffer[64] = {0};
//    while(1){
//        //我们没有让父进程sleep
//        sleep(1);
//        ssize_t s = read(pipefd[0], buffer, sizeof(buffer)-1);//如果read返回值是0，就意味着子进程关闭文件描述符了
//        if(s == 0){
//            break;
//        }
//        else if(s > 0){
//            buffer[s] = 0;
//            printf("child say to father：%s\n",buffer);
//        }
//        else{
//            break;
//        }
//    }
//    return 0;
//}

//int pipe(int pipefd[2]);
//pipe[2]:是一个输出型参数，我们向通过这个参数读取到打开的两个fd



//让父进程sleep,不让子进程不sleep
//int main()
//{
//    int pipefd[2] = {0};
//    if(pipe(pipefd) != 0){
//        perror("pipe error!");
//        return 1;
//    }
//
//    //pipefd[0]:读取端  pipefd[1]:写入端
//    printf("pipefd[0]：%d\n",pipefd[0]);//3
//    printf("pipefd[1]：%d\n",pipefd[1]);//4
//
//    //我们想让父进程进行读取，子进程进行写入
//    if(fork() == 0){
//        //子进程---写入
//        close(pipefd[0]);
//        const char* msg = "hello-linux!";
//        while(1){
//            write(pipefd[1], msg, strlen(msg));
//        }
//        exit(0);
//    }
//    //父进程---读取
//    close(pipefd[1]);
//    while(1){
//        sleep(1);
//        char buffer[64] = {0};
//        ssize_t s = read(pipefd[0], buffer, sizeof(buffer) - 1);//如果read返回值是0，就意味着子进程关闭文件描述符了
//        if(s == 0){
//            printf("child quit...\n");
//            break;
//        }
//        else if(s > 0){
//            buffer[s] = 0;
//            printf("child say to father：%s\n",buffer);
//        }
//        else{
//            printf("read error...\n");
//            break;
//        }
//    }
//    return 0;
//}





int main()
{
    int pipefd[2] = {0};
    if(pipe(pipefd) != 0){
        perror("pipe error!");
        return 1;
    }

    //pipefd[0]:读取端  pipefd[1]:写入端
    printf("pipefd[0]：%d\n",pipefd[0]);//3
    printf("pipefd[1]：%d\n",pipefd[1]);//4

    //我们想让父进程进行读取，子进程进行写入
    if(fork() == 0){
        //子进程---写入
        close(pipefd[0]);
        const char* msg = "hello-linux!";
        while(1){
            write(pipefd[1], msg, strlen(msg));
        }
        exit(0);
    }
    //父进程---读取
    close(pipefd[1]);
    while(1){
        sleep(5);
        char c[64] = {0};
        ssize_t s = read(pipefd[0], &c, sizeof(c)-1);
        if(s > 0){
            c[s] = 0;
            printf("father taken：%s\n",c);
        }
        else if(s ==0){
            printf("write quit...\n");
            break;
        }
        else{
            break;
        }
        break;
    }
    close(pipefd[0]);
    int status = 0;
    waitpid(-1, &status, 0);
    printf("exit code: %d\n",(status >> 8)& 0xFF);
    printf("exit signal: %d\n",status& 0x7F);
    return 0;
}









































